package day0803;
//回溯+dfs
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

public class DiGui {
    public static void main(String[] args) {
        System.out.println(new DiGui().combine(4,2));
    }
    //回溯法
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        //特殊情况
        if(k <=0 || n<k){
            return ans;
        }
        Deque<Integer> path = new ArrayDeque<>();//队列
        dfs(n,k,1,path,ans);//题目默认下标从1开始
        return ans;

    }
    private void dfs(int n,int k,int begin,Deque<Integer> path,List<List<Integer>> ans){

        if(path.size() == k){             //递归终止条件
            ans.add(new ArrayList<>(path));//存放结果
            return;
        }
        // for(int i=begin;i<=n;i++){//横向遍历
        //     path.addLast(i);//处理节点   addLast(i);后进先出
        //     dfs(n,k,i+1,path,ans);//递归
        //     path.removeLast();//回溯，撤销处理结果
        // }
        //循环条件可以做剪枝处理
        for(int i=begin;i<=n-(k-path.size())+1;i++){//横向遍历
            path.addLast(i);//处理节点   addLast(i);
            dfs(n,k,i+1,path,ans);//递归
            path.removeLast();//回溯，撤销处理结果
        }

    }
}
